﻿using CSF.Utility.Security;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace CSF.Utility.Security.Testing
{
    
    
    /// <summary>
    ///这是 AppCodecTest 的测试类，旨在
    ///包含所有 AppCodecTest 单元测试
    ///</summary>
    [TestClass()]
    public class AppCodecTest
    {


        private TestContext testContextInstance;

        /// <summary>
        ///获取或设置测试上下文，上下文提供
        ///有关当前测试运行及其功能的信息。
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region 附加测试特性
        // 
        //编写测试时，还可使用以下特性:
        //
        //使用 ClassInitialize 在运行类中的第一个测试前先运行代码
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //使用 ClassCleanup 在运行完类中的所有测试后再运行代码
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //使用 TestInitialize 在运行每个测试前先运行代码
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //使用 TestCleanup 在运行完每个测试后运行代码
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion


        /// <summary>
        ///Decode 的测试
        ///</summary>
        [TestMethod()]
        public void DecodeTest()
        {
            string encryptCode = "PXWVqYv_gJ3ofRGSdkItdg2"; // TODO: 初始化为适当的值
            string timeStamp = "12345678"; // TODO: 初始化为适当的值
            string appCode = string.Empty; // TODO: 初始化为适当的值
            string appCodeExpected = "ADMIN"; // TODO: 初始化为适当的值
            bool expected = true; // TODO: 初始化为适当的值
            bool actual;
            actual = AppCodec.Decode(encryptCode, timeStamp, out appCode);
            Assert.AreEqual(appCodeExpected, appCode);
            Assert.AreEqual(expected, actual);
            //Assert.Inconclusive("验证此测试方法的正确性。");
        }

        /// <summary>
        ///Encode 的测试
        ///</summary>
        [TestMethod()]
        public void EncodeTest()
        {
            string appCode = "ADMIN"; // TODO: 初始化为适当的值
            string timeStamp = "12345678"; // TODO: 初始化为适当的值
            if (timeStamp.Length > 8)
            {
                timeStamp = timeStamp.Substring(timeStamp.Length - 8);
            }
            else if (timeStamp.Length < 8)
            {
                timeStamp = timeStamp.PadRight(8, '0');
            }
            string expected = "PXWVqYv_gJ3ofRGSdkItdg2"; // TODO: 初始化为适当的值
            string actual;
            actual = AppCodec.Encode(appCode, timeStamp);
            Assert.AreEqual(expected, actual);
            //Assert.("验证此测试方法的正确性。");
        }

        /// <summary>
        ///GenerateKey 的测试
        ///</summary>
        [TestMethod()]
        [DeploymentItem("CSF.Utility.Security.dll")]
        public void GenerateKeyTest()
        {
            string timeStamp = "12345678"; // TODO: 初始化为适当的值
            byte[] expected = new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 }; // TODO: 初始化为适当的值
            byte[] actual;
            actual = AppCodec_Accessor.GenerateKey(timeStamp);

            string expstr = System.Text.Encoding.UTF8.GetString(expected);
            string actstr = System.Text.Encoding.UTF8.GetString(actual);
            Assert.AreEqual(expstr, actstr);
            //Assert.Inconclusive("验证此测试方法的正确性。");
        }
    }
}
